package br.com.site;

import java.util.ArrayList;
import java.util.List;

import model.Equipamento;
import model.Equipe;
import model.Estrutura;
import model.Instituicao;
import model.PDI;
import model.Perigo;
import model.Unidade;
import model.Veiculo;
import model.Vitima;
import view.ActionItem;
import view.ExpansaoPDI;
import view.QuickAction;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TableRow;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class MainActivity extends MapActivity {

	//activities
	final static int NOVO_VEICULO_ACTIVITY = 1;
	final static int NOVO_ESTRUTURA_ACTIVITY = 2;
	final static int NOVO_EQUIPAMENTO_ACTIVITY = 3;
	final static int NOVO_EQUIPE_ACTIVITY = 4;
	final static int NOVO_PERIGO_ACTIVITY = 5;
	final static int NOVO_VITIMA_ACTIVITY = 6;
	final int NOVO_INSTITUICAO_ACTIVITY = 7;
	final int EXIBICAO = 8;
	///////////////////////////////////////////////////
	private Toast toast;
	private long lastBackPressTime = 0;
	///////////////////////////////////////////////////
	public static MapView mapView;
	///////////////////////////////////////////////////
	protected static final int VEICULO = 1;
	protected static final int ESTRUTURA = 2;
	protected static final int EQUIPAMENTO = 3;
	protected static final int EQUIPE = 4;
	protected static final int PERIGO = 5;
	protected static final int VITIMA = 6;
	///////////////////////////////////////////////////
	public List<LinearLayout> actionBarBtns;
	public QuickAction quickaction;
	///////////////////////////////////////////////////
	public static ObjPers veiculoOverlays, estruturaOverlays, equipamentoOverlays, equipeOverlays, vitimaOverlays, perigoOverlays;
	public ObjPers qualquerOverlays;
	public List<ObjPers> listaDeOverlays;
	///////////////////////////////////////////////////
	public static ArrayList<List<? extends PDI>> listaDeListas;
	public static List<Veiculo> listaVeiculos;
	public static List<Estrutura> listaEstruturas;
	public static List<Equipamento> listaEquipamentos;
	public static List<Equipe> listaEquipes;
	public static List<Perigo> listaPerigos;
	public static List<Vitima> listaVitimas;
	
	public static List<Instituicao> listaInstituicoes;
	public static List<Unidade> listaUnidades;
	///////////////////////////////////////////////////
	public static PDI objetoPassado;
	///////////////////////////////////////////////////
	private int cor;
	private int poligono;
	private int corDefinida;
	private boolean apagar, dLivre = false;
	private Desenho desLiv;
	///////////////////////////////////////////////////
	
	
    // Called when the activity is first created.
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        carregaNovoMapa();
        carregaActionBar();
        exibirActionBar();
    }
    
    public void carregaActionBar(){
    	actionBarBtns = new ArrayList<LinearLayout>();
    	
    	LinearLayout mao = (LinearLayout) findViewById(R.id.cj_mao);
    	LinearLayout desenho = (LinearLayout) findViewById(R.id.cj_desenho);
    	LinearLayout novo = (LinearLayout) findViewById(R.id.cj_novo);
    	LinearLayout exibicao = (LinearLayout) findViewById(R.id.cj_exibicao);
    	
    	actionBarBtns.add(mao);
    	actionBarBtns.add(desenho);
    	actionBarBtns.add(novo);
    	actionBarBtns.add(exibicao);
    	
    	final LinearLayout barraDesenho = (LinearLayout) findViewById(R.id.desenho_layout);
    	
    	mao.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				barraDesenho.setVisibility(View.GONE);
				esconderActionBar();
			}
		});
    	
    	desenho.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				carregaMenusDesenho(barraDesenho);
				esconderActionBar();
			}
		});
    	
    	final ActionItem veiculo = setActionItem("Veículo", R.drawable.car_icon, new Intent(MainActivity.this, NovoVeiculo.class));
    	final ActionItem estrutura = setActionItem("Estrutura", R.drawable.casa_icon, new Intent(MainActivity.this, NovoEstrutura.class));
    	final ActionItem equipamento = setActionItem("Equipamento", R.drawable.equipment_icon, new Intent(MainActivity.this, NovoEquipamento.class));
    	final ActionItem equipe = setActionItem("Equipe", R.drawable.team_icon, new Intent(MainActivity.this, NovoEquipe.class));
    	final ActionItem perigo = setActionItem("Perigo", R.drawable.danger_icon, new Intent(MainActivity.this, NovoPerigo.class));
    	final ActionItem vitima = setActionItem("Vítima", R.drawable.victim_icon, new Intent(MainActivity.this, NovoVitima.class));
    	final ActionItem instituicao = setActionItem("Instituição", R.drawable.ic_instituicao, new Intent(MainActivity.this, NovoInstituicao.class));
    	
    	final ActionItem unidade = new ActionItem();
		unidade.setTitle("Unidade");
		unidade.setIcon(getResources().getDrawable(R.drawable.ic_unidade));
		unidade.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Dialog criaUnidade = new Dialog(MainActivity.this);
				criaUnidade.requestWindowFeature(Window.FEATURE_NO_TITLE);
	        	criaUnidade.setContentView(R.layout.novo_unidade);
	        	criaUnidade.setTitle("Nova Unidade");
	        	carregaCriacaoUnidade(criaUnidade);
	        	quickaction.dismiss();
	        	criaUnidade.show();
			}
		});
    	
    	novo.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				QuickAction qa = new QuickAction(v);
				qa.setAnimStyle(QuickAction.ANIM_REFLECT);
				quickaction = qa;
				
				qa.addActionItem(veiculo);
				qa.addActionItem(estrutura);
				qa.addActionItem(equipamento);
				qa.addActionItem(equipe);
				qa.addActionItem(perigo);
				qa.addActionItem(vitima);
				qa.addActionItem(instituicao);
				qa.addActionItem(unidade);
				
				qa.show();
			}
		});
    	
    	exibicao.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				startActivity(new Intent(MainActivity.this, Exibicao.class));
				if(quickaction != null){
					if(quickaction.isShown()){
						quickaction.dismiss();
					}
				}
			}
		});
    }
     
    public ActionItem setActionItem(String title, int icon, final Intent intent){
    	ActionItem ai = new ActionItem();
    	ai.setTitle(title);
    	ai.setIcon(getResources().getDrawable(icon));
    	
    	ai.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				startActivity(intent);
				quickaction.dismiss();
			}
		});
    	
    	return ai;
    }
    
    /** Novo mapa e seus recursos */
    public void carregaNovoMapa(){
    	getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    	setContentView(R.layout.mapa);
    	mapView = (MapView) findViewById(R.id.mapView);
    	
    	MapController mc = mapView.getController();
    	mc.setZoom(15);
    	mc.animateTo(new GeoPoint(-22862767,-43236342));
    	
        /** controles do zoom */
        mapView.setBuiltInZoomControls(true);
        
        /** icone padrao dos tipos de pdis */
        Drawable iconeVeiculo = getResources().getDrawable(R.drawable.car_icon);
    	Drawable iconeEstrutura = getResources().getDrawable(R.drawable.casa_icon);
    	Drawable iconeEquipamento = getResources().getDrawable(R.drawable.equipment_icon);
    	Drawable iconeEquipe = getResources().getDrawable(R.drawable.team_icon);
    	Drawable iconePerigo = getResources().getDrawable(R.drawable.danger_icon);
    	Drawable iconeVitima = getResources().getDrawable(R.drawable.victim_icon);
        
        /** cria os Objetos Personalizados que carregarao os overlays */
		veiculoOverlays = new ObjPers(iconeVeiculo, mapView);
		estruturaOverlays = new ObjPers(iconeEstrutura, mapView);
		equipamentoOverlays = new ObjPers(iconeEquipamento, mapView);
		equipeOverlays = new ObjPers(iconeEquipe, mapView);
		perigoOverlays = new ObjPers(iconePerigo, mapView);
		vitimaOverlays = new ObjPers(iconeVitima, mapView);
		
		listaDeOverlays = new ArrayList<ObjPers>();
		listaDeOverlays.add(veiculoOverlays);
		listaDeOverlays.add(estruturaOverlays);
		listaDeOverlays.add(equipamentoOverlays);
		listaDeOverlays.add(equipeOverlays);
		listaDeOverlays.add(perigoOverlays);
		listaDeOverlays.add(vitimaOverlays);
		
		listaDeListas = new ArrayList<List<? extends PDI>>();
		
		// Carregarei as listas de PDIs
		listaVeiculos = new ArrayList<Veiculo>();
		listaEstruturas = new ArrayList<Estrutura>();
		listaEquipamentos = new ArrayList<Equipamento>();
		listaEquipes = new ArrayList<Equipe>();
		listaPerigos = new ArrayList<Perigo>();
		listaVitimas = new ArrayList<Vitima>();
		
		listaDeListas.add(listaVeiculos);
		listaDeListas.add(listaEstruturas);
		listaDeListas.add(listaEquipamentos);
		listaDeListas.add(listaEquipes);
		listaDeListas.add(listaPerigos);
		listaDeListas.add(listaVitimas);
		
		listaInstituicoes = new ArrayList<Instituicao>();
		listaUnidades = new ArrayList<Unidade>();
		
		//TODO ja fez tudo? Pode me tirar daqui! :)
		PDIsFicticios();
		
		
		// TODO Que tal implementar reverse Geocoding?
		
		
		/////////////////////////////////////////
		// vou realmente desenhar tudo no mapa //
		/////////////////////////////////////////
		
		getMapOverlays();
    }
    
    public void PDIsFicticios(){
    	/** PDIs ficticios */
		Instituicao bombeiros = new Instituicao("Bombeiros", "Tenente Jonas da Silva");
		listaInstituicoes.add(bombeiros);
		Instituicao policia = new Instituicao("Polícia Militar", "Sargento Carlos de Andrade");
		listaInstituicoes.add(policia);
		Instituicao comlurb = new Instituicao("Comlurb", "Márcio Chaves");
		listaInstituicoes.add(comlurb);
		Instituicao exc = new Instituicao("Exército", "Darío Alves");
		listaInstituicoes.add(exc);
		
		Unidade un = new Unidade("UA25", "Francisco Santos");
		Unidade un2 = new Unidade("PO07", "Delegado Mauro César");
		Unidade un3 = new Unidade("BO13", "Cabo Diego Lima");
		
		listaUnidades.add(un);
		listaUnidades.add(un2);
		listaUnidades.add(un3);
		
		GeoPoint p1 = new GeoPoint(-22867037, -43238003);
		GeoPoint p2 = new GeoPoint(-22856044, -43244784);
		PDI carro2 = new Veiculo(p1, "AMB01", "", null, null, "Q11", "Ambulância","Ambulância Comum", bombeiros);
		PDI casa2 = new Estrutura(p2, "HOSPITAL01", "", null, null, null, "D'Or", "Hospital", 600, 0, 2, "Concreto", "Grande", 2, 4, 1, "Estacionamento", 2, 70, 45000, 12);
		
		Veiculo carro = new Veiculo(new GeoPoint(-22864981, -43221525), "AIR01", "", null, null, "A12", "Veículo Aéreo", "Avião Tanque", policia);
		Estrutura casa = new Estrutura(new GeoPoint(-22854778, -43231995), "EDF01", "", null, null, null, "EDC314", "Edifício Comercial", 300, 1, 4, "Concreto", "Pequeno", 2, 4, 1, "Garagem", 2, 220, 15000, 25);
		Equipamento equip = new Equipamento(new GeoPoint(-22864982, -43221525), "Equipamento", "", carro, null, "E01", "Marreta", 3, 1);
		Equipe team = new Equipe(new GeoPoint(-22869409, -43243153), "EX02", "", null, null, null, "E33", "Dr. Ivan", exc, un, 3, 12, 4, "Fiscalização");
		Perigo danger = new Perigo(new GeoPoint(-22868777, -43218349), "SUBST01", "", team, null, "Substâncias Tóxicas", 3, "Sim", "PER01");
		Vitima victim = new Vitima(new GeoPoint(-22862529, -43242037), "VIT04", "", casa, team, danger, "V04", 25, 12, 13, 4, 1);
		
		criarOverlay(carro);
		criarOverlay(carro2);
		criarOverlay(casa);
		criarOverlay(casa2);
		criarOverlay(equip);
		criarOverlay(team);
		criarOverlay(danger);
		criarOverlay(victim);
    }

	public void getMapOverlays(){
    	List<Overlay> mapOverlays = mapView.getOverlays();
    	
    	if (!mapOverlays.contains(veiculoOverlays)) mapOverlays.add(veiculoOverlays);
    	if (!mapOverlays.contains(estruturaOverlays)) mapOverlays.add(estruturaOverlays);
    	if (!mapOverlays.contains(equipamentoOverlays)) mapOverlays.add(equipamentoOverlays);
    	if (!mapOverlays.contains(equipeOverlays)) mapOverlays.add(equipeOverlays);
    	if (!mapOverlays.contains(perigoOverlays)) mapOverlays.add(perigoOverlays);
    	if (!mapOverlays.contains(vitimaOverlays)) mapOverlays.add(vitimaOverlays);
    	
    	//redesenhar o mapa
    	mapView.postInvalidate();
    }
    
    public static void criarOverlay(PDI objeto){
    	switch (objeto.getTipo()){
    	case 0: break;
    	case VEICULO:
    		Veiculo vei = (Veiculo) objeto;
    		listaVeiculos.add(vei);
    		veiculoOverlays.addOverlay(vei.getOverlayItem(), vei);
    		break;
    	case ESTRUTURA:
    		Estrutura est = (Estrutura) objeto;
    		listaEstruturas.add(est);
    		estruturaOverlays.addOverlay(est.getOverlayItem(), est);
    		break;
    	case EQUIPAMENTO:
    		Equipamento eqp = (Equipamento) objeto;
    		listaEquipamentos.add(eqp);
    		equipamentoOverlays.addOverlay(eqp.getOverlayItem(), eqp);
    		break;
    	case EQUIPE:
    		Equipe team = (Equipe) objeto;
    		listaEquipes.add(team);
    		equipeOverlays.addOverlay(team.getOverlayItem(), team);
    		break;
    	case PERIGO:
    		Perigo prg = (Perigo) objeto;
    		listaPerigos.add(prg);
    		perigoOverlays.addOverlay(prg.getOverlayItem(), prg);
    		break;
    	case VITIMA:
    		Vitima vit = (Vitima) objeto;
    		listaVitimas.add(vit);
    		vitimaOverlays.addOverlay(vit.getOverlayItem(), vit);
    		break;
    	default: break;
    	}
    }
    
    /*TODO fazer validação dos campos de cada funcao a seguir
     * como id nao-vazio, ou nao poder ter dois IDs iguais, etc
     */
    
    public void carregaCriacaoUnidade(final Dialog criaUnidade){
    	final EditText etIdUnidade = (EditText) criaUnidade.findViewById(R.novo_unidade.etIdUnidade);
    	final EditText etChefeUnidade = (EditText) criaUnidade.findViewById(R.novo_unidade.etChefeUnidade);
    	final Button salvar = (Button) criaUnidade.findViewById(R.novo_unidade.btCriaUnid);
    	
    	salvar.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String nomeChefe = etChefeUnidade.getText().toString();
            	String identificacao = etIdUnidade.getText().toString();
            	
            	if(!identificacao.trim().equals("")){
            		Unidade unid = new Unidade(identificacao, nomeChefe);
                	listaUnidades.add(unid);
                	criaUnidade.dismiss();
                	exibeToast(getApplicationContext(), "Unidade criada com sucesso");
            	}else{
            		etIdUnidade.setError("Um ID deve ser definido para esta unidade");
            	}
			}
		});	
    }
    
    public void carregaMenusDesenho(LinearLayout barraPrincipal){
    	final LinearLayout barraDesenho = barraPrincipal;
    	
    	final TableRow iconesDesenhoBarra = (TableRow) findViewById(R.id.desenho_icones_barra);
    	final TableRow textosDesenhoBarra = (TableRow) findViewById(R.id.desenho_texto_barra);
    	final TableRow botoesPoligonoBarra = (TableRow) findViewById(R.id.desenho_botoes_poligono_barra);
    	
    	barraDesenho.setVisibility(View.VISIBLE);
    	iconesDesenhoBarra.setVisibility(View.VISIBLE);
    	textosDesenhoBarra.setVisibility(View.VISIBLE);
    	botoesPoligonoBarra.setVisibility(View.GONE);
    	
    	ImageButton desenhoLivre = (ImageButton) findViewById(R.id.bt_desenho);
    	ImageButton desenhoPoligono = (ImageButton) findViewById(R.id.bt_poligono);
    	ImageButton desenhoCores = (ImageButton) findViewById(R.id.bt_cores);
    	ImageButton desenhoBorracha = (ImageButton) findViewById(R.id.bt_borracha);
    	
    	Button novoTriangulo = (Button) findViewById(R.id.bt_triangulo);
    	Button novoRetangulo = (Button) findViewById(R.id.bt_retangulo);
    	Button novoPentagono = (Button) findViewById(R.id.bt_pentagono);
        desenhoLivre.setOnClickListener(new OnClickListener() {  
            public void onClick(View v) {  
            	iconesDesenhoBarra.setVisibility(View.GONE);
            	textosDesenhoBarra.setVisibility(View.GONE);
            	barraDesenho.setVisibility(View.GONE);
            	
            	exibeToast(getApplicationContext(), "Modo desenho livre:\nToque na tela para desenhar e solte para fechar a região");
            	dLivre = true;
            	poligono = Desenho.LIVRE;
            }  
        });

        desenhoPoligono.setOnClickListener(new OnClickListener() {  
            public void onClick(View v) {  
            	iconesDesenhoBarra.setVisibility(View.GONE);
            	textosDesenhoBarra.setVisibility(View.GONE);
            	botoesPoligonoBarra.setVisibility(View.VISIBLE);
            }  
        });
        
        desenhoCores.setOnClickListener(new OnClickListener() {  
            public void onClick(View v) {            	
            	MainActivity.this.corDefinida = MainActivity.this.cor;
            	colorpicker();
            }  
        });

        desenhoBorracha.setOnClickListener(new OnClickListener() {  
            public void onClick(View v) {
            	apagar = true;
    	    	for (Overlay o : mapView.getOverlays()) {
    	    		if (o instanceof Desenho) ((Desenho) o).setApagar(apagar);
    			}
    	    	exibeToast(getApplicationContext(), "Ferramenta \"borracha\" selecionada\nClique em alguma região para apagá-la");
            }  
        });
        ////////////////////////////////////////////////////////////
        novoTriangulo.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				poligono = Desenho.TRIANGULO;
				exibeToast(getApplicationContext(), "Posicione os vértices do triângulo");
				barraDesenho.setVisibility(View.GONE);
				Global.desPoligono = true;
			}
		});
        
        novoRetangulo.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				poligono = Desenho.RETANGULO;
				exibeToast(getApplicationContext(), "Posicione os vértices do retângulo");
				barraDesenho.setVisibility(View.GONE);
				Global.desPoligono = true;
			}
		});

        novoPentagono.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				poligono = Desenho.PENTAGONO;
				exibeToast(getApplicationContext(), "Posicione os vértices do pentágono");
				barraDesenho.setVisibility(View.GONE);
				Global.desPoligono = true;
			}
		});
    
    }
    
    public void colorpicker()
    {
    	br.com.site.AmbilWarnaDialog.OnAmbilWarnaListener listener = new br.com.site.AmbilWarnaDialog.OnAmbilWarnaListener() {
			
			@Override
			public void onOk(br.com.site.AmbilWarnaDialog dialog, int color) {
				String s = Integer.toHexString(color);
    			s = "33" + s.substring(2);
    			int corTransp = Integer.valueOf(s, 16).intValue();
    			corDefinida = cor = corTransp;
			}
			
			@Override
			public void onCancel(br.com.site.AmbilWarnaDialog dialog) {}
		};
		AmbilWarnaDialog dialog = new AmbilWarnaDialog(this, this.corDefinida, listener);

        dialog.show();
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
	    if (keyCode == KeyEvent.KEYCODE_MENU) {
	    	RelativeLayout actionBar = (RelativeLayout) findViewById(R.id.actionbar);
	    	
	    	if(actionBar.getVisibility() == View.VISIBLE){
	    		esconderActionBar();
	    	}else{
	    		exibirActionBar();
	    	}
	    }
	    return super.onKeyDown(keyCode, event);
    }
       
    /**Definirei as funcoes do botao 'back' para evitar sair da aplicacao sem querer */
    @Override
    public void onBackPressed() {
    	if (this.lastBackPressTime < System.currentTimeMillis() - 2000) {
    		toast = Toast.makeText(this, "Toque em voltar novamente para sair da aplicação", 2000);
    		toast.show();
    		this.lastBackPressTime = System.currentTimeMillis();
    	}else{
    		if (toast != null) {
    			toast.cancel();
    		}
    		super.onBackPressed();
    	}
    }
    
    /**Exibe um toast simples com o texto */
    public static void exibeToast(Context context, String texto){
    	CharSequence textoToast = texto;
    	Toast toast = Toast.makeText(context, textoToast, Toast.LENGTH_SHORT);
    	toast.show();
    }
    
    public void exibirActionBar(){
    	RelativeLayout actionBar = (RelativeLayout) findViewById(R.id.actionbar);
    	
    	actionBar.setVisibility(View.VISIBLE);
		findViewById(R.id.actionbar_princ).setVisibility(View.VISIBLE);
    	TranslateAnimation abEntrada = new TranslateAnimation(0, 0, -(actionBar.getHeight()), 0);
    	abEntrada.setDuration(650);
    	abEntrada.setFillEnabled(true);
    	abEntrada.setFillAfter(true);
    	actionBar.startAnimation(abEntrada);
    	
    	for (LinearLayout ll : actionBarBtns) {
			ll.setClickable(true);
		}
    }
    
    public void esconderActionBar(){
    	RelativeLayout actionBar = (RelativeLayout) findViewById(R.id.actionbar);
    	
    	TranslateAnimation abSaida = new TranslateAnimation(0, 0, 0, -(actionBar.getHeight()));
    	abSaida.setDuration(650);
    	abSaida.setFillEnabled(true);
    	abSaida.setFillAfter(true);
    	actionBar.startAnimation(abSaida);
    	actionBar.setVisibility(View.GONE);
    	
    	for (LinearLayout ll : actionBarBtns) {
			ll.setClickable(false);
		}
    }
    
    /**metodo obrigatorio...avisa ao google que nao ha rota exibida */
    @Override
	protected boolean isRouteDisplayed() {
		return false;
	}
	    
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
    	boolean permiteCriarPDI = Global.novoPdi;
    	PDI objeto = objetoPassado;
    	
    	GeoPoint gp = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());
    	
    	//quando o usuario levantar o dedo, e quando novoPdi for true, desenharei o pdi
    	if (event.getAction() == MotionEvent.ACTION_DOWN){
    		if(permiteCriarPDI == true){
	    		GeoPoint projecao = gp;
	    		
	    		objeto.setGeoPoint(projecao);
	    		criarOverlay(objeto);
	    		mapView.postInvalidate();
	    		Global.novoPdi = false;

	    		/*if (objeto instanceof Veiculo){
	    			//Log.e("SiTE", ((Veiculo) objeto).getXML());//TODO se precisar gerar XML tem que ser neste momento, depois de setar o geopoint
	    			FileHandler fh = new FileHandler();
	    			fh.salvarXML(this, "testedesalvamentoxml.xml", ((Veiculo) objeto).getXML());
	    			//Log.i("SiTE", fh.lerXML(this, "testedesalvamentoxml.xml"));
	    		}*/
    		}else if (Global.desPoligono){
    			GeoPoint inicial = gp;
    			
    			if (cor == 0) cor = Desenho.VERMELHO; //vermelho padrão
    			if (poligono == 0) poligono = Desenho.RETANGULO; //retangulo padrão
    			Desenho des = new Desenho(mapView, inicial, cor, poligono);
    			mapView.getOverlays().add(des);
    			Global.desPoligono = false;
    		}
    	}
    	if(dLivre){
    		if(event.getAction() == MotionEvent.ACTION_DOWN){
    			if (cor == 0) cor = Desenho.VERMELHO;
    			desLiv = new Desenho(mapView, gp, cor, Desenho.LIVRE);
    			mapView.getOverlays().add(desLiv);
    			return true; //nao posso deixar o mapa se mover
    		}
    		if(event.getAction() == MotionEvent.ACTION_MOVE){
    			desLiv.getList().add(gp);
    			mapView.invalidate();
    			return true;
    		}
    		if(event.getAction() == MotionEvent.ACTION_UP){
    			desLiv.fecharPath();
    			mapView.invalidate();
    			dLivre = false;
    			return true;
    		}
    	}
    	return super.dispatchTouchEvent(event);
    }
    
	public class ObjPers extends BalloonItemizedOverlay<OverlayItem>{

		private ArrayList<OverlayItem> m_overlays = new ArrayList<OverlayItem>();
		private Context c;
		private ArrayList<Overlay> l_overlays = new ArrayList<Overlay>();

		private Drawable marker;
		
		public ObjPers(Drawable defaultMarker, MapView mapView) {
			super(boundCenter(defaultMarker), mapView);
			c = mapView.getContext();
			this.marker = defaultMarker;
			populate();
		}

		public void addOverlay(OverlayItem overlay, PDI objeto) {
			int idDoIcone = getIconeCerto(objeto);
			if (idDoIcone != 0){
				Drawable icone = getResources().getDrawable(idDoIcone);
				icone.setBounds(this.marker.getBounds());
				overlay.setMarker(icone);
			}
			
			m_overlays.add(overlay);
		    populate();
		    l_overlays.add(objeto);
		    //pro caso de a lista ter sido limpa recentemente, vai evitar probs com o index
		    setLastFocusedIndex(-1); 
		}
		
		public ArrayList<Overlay> getL_overlays() {
			return l_overlays;
		}

		@Override
		protected OverlayItem createItem(int i) {
			return m_overlays.get(i);
		}
		
		public void clear() {
	        m_overlays.clear();
	        populate();
	        l_overlays.clear();
	    }

		@Override
		public int size() {
			return m_overlays.size();
		}
		
		@Override
		public void draw(Canvas canvas, MapView mapView, boolean shadow) {
			super.draw(canvas, mapView, false); //retirar a sombra
		}
		
		@Override
		public boolean onTap(GeoPoint p, MapView mapView) {
			if (this.m_overlays.size()>0){
				return super.onTap(p, mapView);
			}
			return false;
			
		}
		
		@Override
		protected boolean onBalloonTap(int index) {
			ExpansaoPDI dialog = new ExpansaoPDI(c, (PDI) l_overlays.get(index));
			dialog.show();
			return true;
		}
	}
	
	public int getIconeCerto(PDI objeto){
		int idDoIcone = 0; //padrao: se for 0 usara o icone padrao do pdi
		
		switch(objeto.getTipo()){
		case 0:
			break;
		case VEICULO:
			Veiculo vei = (Veiculo) objeto;
			if(vei.getTipoDeVeiculo().equals("Ambulância")){
				idDoIcone = R.drawable.ic_ambulancia;
			}else if (vei.getTipoDeVeiculo().equals("Veículo Aéreo")){
				idDoIcone = R.drawable.ic_veiculoaereo;
			}else if (vei.getTipoDeVeiculo().equals("Veículo de Socorro Terrestre")){
				idDoIcone = R.drawable.ic_veiculoterrestre;
			}else if (vei.getTipoDeVeiculo().equals("Veículo de Socorro Aquático")){
				idDoIcone = R.drawable.ic_veiculoaquatico;
			}
			break;
		case ESTRUTURA:
			Estrutura est = (Estrutura) objeto;
			if(est.getTipoDeEstrutura().equals("Hospital")){
				idDoIcone = R.drawable.ic_hospital;
			}else if (est.getTipoDeEstrutura().equals("Edifício")){
				idDoIcone = R.drawable.ic_predio;
			}else if (est.getTipoDeEstrutura().equals("Estádio")){
				idDoIcone = R.drawable.ic_estadio;
			}else if (est.getTipoDeEstrutura().equals("Casa")){
				idDoIcone = R.drawable.ic_casa;
			}else if (est.getTipoDeEstrutura().equals("Edifício Comercial")){
				idDoIcone = R.drawable.ic_prediocomercial;
			}else if (est.getTipoDeEstrutura().equals("Indústria")){
				idDoIcone = R.drawable.ic_industria;
			}else if (est.getTipoDeEstrutura().equals("Shopping Center")){
				idDoIcone = R.drawable.ic_shopping;
			}
			break;
		case EQUIPAMENTO:
			break; //nao tem subdivisao
		case EQUIPE:
			Equipe team = (Equipe) objeto;
			try{
				Instituicao i = team.getInst();
				if(i.getTipoDeInstituicao().equals("Bombeiros")){
					idDoIcone = R.drawable.ic_bombeiros;
				}else if(i.getTipoDeInstituicao().equals("Voluntário")){
					idDoIcone = R.drawable.ic_voluntario;
				}else if(i.getTipoDeInstituicao().equals("Def. Civil Mun.")
						|| i.getTipoDeInstituicao().equals("Def. Civil Estad.")){
					idDoIcone = R.drawable.ic_defesacivil;
				}else if(i.getTipoDeInstituicao().equals("Comlurb")){
					idDoIcone = R.drawable.ic_comlurb;
				}else if(i.getTipoDeInstituicao().equals("IBAMA")){
					idDoIcone = R.drawable.ic_ibama;
				}else if(i.getTipoDeInstituicao().equals("CET-Rio")
						|| i.getTipoDeInstituicao().equals("CEG")
						|| i.getTipoDeInstituicao().equals("IML")
						|| i.getTipoDeInstituicao().equals("Light")
						|| i.getTipoDeInstituicao().equals("CEDAE")
						|| i.getTipoDeInstituicao().equals("Geo-Rio")
						|| i.getTipoDeInstituicao().equals("CNEN")){
					idDoIcone = R.drawable.ic_public;
				}else if(i.getTipoDeInstituicao().equals("INEA")){
					idDoIcone = R.drawable.ic_inea;
				}else if (i.getTipoDeInstituicao().equals("Polícia Militar")
						|| i.getTipoDeInstituicao().equals("Polícia Civil")){
					idDoIcone = R.drawable.ic_policia;
				}else if (i.getTipoDeInstituicao().equals("Engenheiros Civis")){
					idDoIcone = R.drawable.ic_engenheiro;
				}else if (i.getTipoDeInstituicao().equals("Exército")
						|| i.getTipoDeInstituicao().equals("Marinha")
						|| i.getTipoDeInstituicao().equals("Aeronáutica")){
					idDoIcone = R.drawable.ic_militares;
				}
			}catch (NullPointerException e){
				
			}
			break;
		case PERIGO:
			Perigo per = (Perigo) objeto;
			if(per.getTipoDePerigo().equals("Gases Tóxicos")){
				idDoIcone = R.drawable.ic_gastoxico;
			}else if (per.getTipoDePerigo().equals("Líquidos Tóxicos")){
				idDoIcone = R.drawable.ic_liquido;
			}else if (per.getTipoDePerigo().equals("Substâncias Tóxicas")){
				idDoIcone = R.drawable.ic_quimica;
			}else if (per.getTipoDePerigo().equals("Exposição Radioativa")){
				idDoIcone = R.drawable.ic_radioativo;
			}else if (per.getTipoDePerigo().equals("Deslizamento de Terra")){
				idDoIcone = R.drawable.ic_pedra;
			}else if (per.getTipoDePerigo().equals("Colapso de Edifício")){
				idDoIcone = R.drawable.ic_prediocolapso;
			}else if (per.getTipoDePerigo().equals("Ratos")){
				idDoIcone = R.drawable.ic_rato;
			}
			break;
		case VITIMA:
			break; //nao tem subdivisao
		default: break;
		}
		
		return idDoIcone;
	}

	public static void editarPDI(Context c, OverlayItem oi){
		PDI pdi = buscaPDIGeoPoint(oi);
		
		Intent intent;
		
		Veiculo ve;
		Estrutura es;
		Equipe te;
		Equipamento eq;
		Perigo pe;
		Vitima vi;
		
		Global.editarPDI=true;
		
		if(pdi instanceof Veiculo){
			ve = (Veiculo) pdi;
			Global.pdiEdicao = ve;
			intent = new Intent(mapView.getContext(), NovoVeiculo.class);
	    	((Activity) mapView.getContext()).startActivityForResult(intent, MainActivity.NOVO_VEICULO_ACTIVITY);
		}else if(pdi instanceof Estrutura){
			es = (Estrutura) pdi;
			Global.pdiEdicao = es;
			intent = new Intent(mapView.getContext(), NovoEstrutura.class);
	    	((Activity) mapView.getContext()).startActivityForResult(intent, MainActivity.NOVO_ESTRUTURA_ACTIVITY);
		}else if(pdi instanceof Equipamento){
			eq = (Equipamento) pdi;
			Global.pdiEdicao = eq;
			intent = new Intent(mapView.getContext(), NovoEquipamento.class);
	    	((Activity) mapView.getContext()).startActivityForResult(intent, MainActivity.NOVO_EQUIPAMENTO_ACTIVITY);
		}else if(pdi instanceof Equipe){
			te = (Equipe) pdi;
			Global.pdiEdicao = te;
			intent = new Intent(mapView.getContext(), NovoEquipe.class);
	    	((Activity) mapView.getContext()).startActivityForResult(intent, MainActivity.NOVO_EQUIPE_ACTIVITY);
		}else if(pdi instanceof Perigo){
			pe = (Perigo) pdi;
			Global.pdiEdicao = pe;
			intent = new Intent(mapView.getContext(), NovoPerigo.class);
	    	((Activity) mapView.getContext()).startActivityForResult(intent, MainActivity.NOVO_PERIGO_ACTIVITY);
		}else if(pdi instanceof Vitima){
			vi = (Vitima) pdi;
			Global.pdiEdicao = vi;
			intent = new Intent(mapView.getContext(), NovoVitima.class);
	    	((Activity) mapView.getContext()).startActivityForResult(intent, MainActivity.NOVO_VITIMA_ACTIVITY);
		}		
	}
		
	public static PDI buscaPDIGeoPoint(OverlayItem oi){
		for (Veiculo v : listaVeiculos) {
			if (v.getGeoPoint().equals(oi.getPoint())){
				return v;
			}
		}
		for (Estrutura e : listaEstruturas) {
			if (e.getGeoPoint().equals(oi.getPoint())){
				return e;
			}
		}
		for (Equipamento q : listaEquipamentos) {
			if (q.getGeoPoint().equals(oi.getPoint())){
				return q;
			}
		}
		for (Equipe t : listaEquipes) {
			if (t.getGeoPoint().equals(oi.getPoint())){
				return t;
			}
		}
		for (Perigo p : listaPerigos) {
			if (p.getGeoPoint().equals(oi.getPoint())){
				return p;
			}
		}
		for (Vitima v : listaVitimas) {
			if (v.getGeoPoint().equals(oi.getPoint())){
				return v;
			}
		}
		
		return null;
	}
}